1.Apache2 のダウンロード
Version | httpd-2.0.48 |
Homepage | http://www.apache.jp |
Download | http://www.apache.jp/dist/httpd/ |
Install | httpd-2.0.48.tar.gz |
--prefix=PREFIX で、インストール場所を選択できます。デフォルトは、/usr/local/apache2 になります。WebDAV を使用したい場合は、--enable-dav を指定します。configureオプションを詳しく参照したい場合は、configure -h で確認してください。MPMについては以下後述。
$ cd /usr/local/src $ tar xzvf httpd-2.0.48.tar.gz $ cd httpd-2.0.48 $ ./configure --with-mpm=worker \ --enable-dav $ make # make install |
Apache2からは、マルチプロセッシングモジュール(MPM)というオプションを指定することができます。オプションを指定しない場合、prework
でインストールされ、安定性と互換性が確保されます。大きなスケーラビリティを必要とするのであればworker、VirtualHostを用いる予定で、パフォーマンスの向上を得たいのであれば、perchild
を選択するのがいいかもしれません。MPMについての詳細な説明はこちらを参照してください。なお、Windows版Apacheを使用するならば、mpm_winnt
がデフォルトになります。
--with-mpm=prework | 安定性や古いソフトウェアとの互換性を保ちたい場合に指定します。MPMオプションを指定しない場合はデフォルトで、prework になります。Apache 1.3 互換で、従来からのプロセスのみ使用し、スレッドは使いません。 |
--with-mpm=worker | マルチスレッドとマルチプロセスのハイブリッド型サーバを 実装します。ThreadsPerChild と MaxClients ディレクティブで効力を発揮します。 |
--with-mpm=perchild | perchild は、VirtualHost を使用する際に効果的なMPMです。<IfModule perchild.c>~</IfModule>で、バーチャルホストごとに独立した動作環境を構築することができるようになります。 |
デフォルトでインストールした場合は、/usr/local/apache2/conf にhttpd.conf
インストールされます。まず、最低限の動作ができるように設定を変更していきます。
# vi /usr/local/apache2/conf/httpd.conf |
ListenでApacheが使用するポート番号を指定します。通常は変更する必要はありませんが、筆者の場合、Windows
上でもApache を動作させているため、ここでは8080を指定しました。squid の起動ポート番号を3128
番から8080 番に変更した方は、squid と重複しないポート番号を指定するようにしてください。
Listen 8080 |
ServerAdminディレクティブは、クライアントからのリクエストに対してエラーメッセージを返す際に表示される管理人のメールアドレスを正しく記述します。通常は、root
や webmaster などを記述しておき、メールサーバーのalias 機能を使用して、実際にメールを受け取る人に配送されるようにしておきます。
ServerAdmin root@click-rescue.com |
ServerNameでは、サーバーのホスト名を記述します。ここでは、ローカルホストを記述します。
ServerName 127.0.0.1:8080 |
ドキュメントルートの設定を行います。ドキュメントルートとは、ホームページのコンテンツを格納するトップの階層のことで、ここで指定した場所に
index.html や画像などを置きます。各自変更する必要があれば変更してください。ここでは、/home/sakura/public_html
をドキュメントルートとして指定します。
DocumentRoot "/home/sakura/public_html" |
AddDefaultCharsetの部分をコメントアウトして無効にするか、off に指定しておきます。このディレクティブが有効になっているとデフォルトの文字コードが ISO-8859-1 となるため、文字化けが発生します。
#AddDefaultCharset ISO-8859-1 |
直接、文字化けには結びつきませんが、デフォルトの使用言語の優先度も変更しておいた方が無難です。Language
Priorityでは、言語の優先度を変更することができます。ここでは、日本語である ja を先頭にし、日本語を最優先にします。
LanguagePriority ja en ca cs da de el eo es et fr he hr it ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW |
以上で最低限、動作する設定は完了です。より詳しく設定を行い方は、httpd.conf
の設定を参照してください。
再起動の前にコンフィグレーションテストを実行してみます。エラーが表示されなければApache2を起動してください。
# /usr/local/apache2/bin/apachectl
configtest Syntax OK |
/usr/local/apache2/bin/apachectl start |
再起動したら、クライアントマシンから 「http://172.16.50.2」のようにしてアクセスしてみましょう。Apacehのテストページが表示されるはずです。 lynx
がインストールされていれば、ローカルホストにアクセスするとテストページが表示されます。クライアントマシンから確認した場合は、お決まりのこちらのようなページが表示されます。
$ lynx http://127.0.0.1:8080 |
最後にシステム起動時にApacheが自動で起動するように /etc/rc.d/init.d に以下の自動起動スクリプトを保存し、実行権限を付与します。
# chmod 755 /etc/rc.d/init.d/httpd # chkconfig --add httpd # chkconfig --list httpd httpd 0:オフ 1:オフ 2:オフ 3:オン 4:オフ 5:オン 6:オフ |
# #!/bin/bash # # Startup script for Apache Web Server # # chkconfig: 345 85 15 # description: Apache is a World Wide Web server. It is used to serve \ # HTML files and CGI. # processname: httpd # pidfile: /var/run/httpd.pid # config: /usr/local/apache2/conf/httpd.conf # See how we were called. case "$1" in start) /usr/local/apache2/bin/apachectl start ;; stop) /usr/local/apache2/bin/apachectl stop ;; status) /usr/local/apache2/bin/apachectl status ;; restart) /usr/local/apache2/bin/apachectl restart ;; graceful) /usr/local/apache2/bin/apachectl graceful ;; *) echo "Usage: $0 {start|stop|restart|graceful|status}" exit 1 esac exit 0 |
1.Section 1: Global Environment
Global Environment は、Apache 全体に影響を与えるセクションです。
ServerRoot は、Apache をインストールした場所のパスが指定されており、このディレクトリ以下に
conf や logs などのサブディレクトリが格納されます。以降で出現するディレクティブの多くは、このServerRoot
からの相対パスで記述されている事が多いため、通常は、デフォルトのままにして置いてください。
ServerRoot "/usr/local/apache2" |
Timeout は、クライアントからの接続要求を受け取ってからタイムアウトになるまでの時間を秒単位で指定します。デフォルトでは、300秒が指定されており、これはたいていのシチュエーションにおいて必要十分な値なので特に変更する必要はありません。ここで設定した時間を過ぎてもパケットが送信されない場合、ブラウザはエラーメッセージを返します。因みに、Apache1.2以前はデフォルトで1200秒が指定されていました。
Timeout 300 |
KeepAlive は、クライアントからの接続要求を受け取った際に、すぐにはHTTPセッションを閉じずに、ある一定の時間までは継続してセッションを保っておく機能です。これは、クライアントからの接続要求があった場合に、クライアントは通常、リンクを辿って他のページを見にいこうとするため、ある一定期間はセッションを保っておこうというものです。当然、有効にしておく事でパフォーマンスの向上に繋がります。
なお、その一定期間の間、セッションを保っておく時間を指定するディレクティブが、KeepAliveTimeout
で、デフォルトでは15秒に設定されています。要するに、クライアントからの接続要求後、15秒経経過しても再接続要求がない場合は、Apache
はセッションを切断します。
MaxKeepAliveRequests は、KeepAlive がOn の時に、接続要求を受け付ける最大許容値を指定します。この値を考慮するには、1ページあたりのファイル数+アルファを考慮しておかなければなりません(画像なども接続要求に含まれるため)。Apache
のドキュメントを読む限りは、この値を高い値に設定しておく事が推奨されています。なお、値を「0」に設定すると無制限になります。
KeepAlive On KeepAliveTimeout 15 MaxKeepAliveRequests 100 |
1.3から2.0のバージョンアップにより、BindAddress ディレクティブと Port ディレクティブは削除され、より柔軟なListen
ディレクティブに置き換わりました。Listen が設定ファイルになければ、サーバは起動に失敗してしまいますので注意してください。
Listen 80 |
Listen ディレクティブでは、特定の IP アドレスやポート番号だけを listen することができるので複数のポート番号を指定したり、IPアドレスとポート番号共に指定する事で、
サーバは指定されたポートとインターフェースに対して listen させることができます。なお、VirtualHostを実装する場合は、ここで指定した以外のポート番号は使用する事ができません。あくまで、Listenディレクテイブで指定した範囲内で<VirtualHost>に指定するようにしてください。
|
|
サーバを実行するためのユーザーとグループを指定します。ここで指定するユーザーとグループに、nobodyを設定する方も多いと思いますが、特定の新しいユーザとグループを作成して、設定する事が推奨されています。その理由として、nobody
ユーザがシステムで 他の役割を担っている可能性もありますので、なんでもかんでも nobody に設定してしまうと今度は逆にnobody
ユーザーが乗っ取られたときの危険性も高くなります。なので、できる限り、専用のユーザーで実行した方が好ましいといえます。
User apache Group apache |
ServerAdmin では、サーバーがエラードキュメントを返す際などに表示される管理者のメールアドレスを指定しておきます。
ServerAdmin root@click-rescue.com |
ServerName は、サーバ自身が使用するサーバ名とポート番号を指定します。このディレクティブは、Apache2からはデフォルトでコメントアウトされており、BIND
でサーバー名が自動取得できるようになっていれば指定する必要はありませんが、起動時の問題を避けるためにも明示的に指定しておく事が推奨されています。
ServerName linux.click-rescue.com:80 |
UseCanonicalName では、Apache 自身が自己参照のURLをどのように決定するかを指定します。On
の場合は、ServerName で指定したポート番号とホスト名をクライアントに返します。Off の場合は、クライアントから提供されたホスト名やポート番号をそのまま使用して返します。この他にも、DNS
を指定する事もできますが、これはIPベースのバーチャルホストで使われる事を想定しており、Hostヘッダーをつけないクライアントをサポートします。基本的には、On
で構わないと思いますが(Apache1.3x ではデフォルトOn だったはず…)、認証を有効にしている場合は、クライアントに対して2度認証を行わせなければならないようです。この辺りは筆者も微妙に理解不足なので、マニュアルの方も併せて参照してください。
UseCanonicalName Off |
もう説明するまでもないと思いますが、ドキュメントルートを指定します。ここで指定したパスにHTMLドキュメント等を置いておきます。基本的には、ここで指定したパスより上位の階層へはアクセスする事ができませんが、SymbolicLink
やalias を使用すれば、他の階層のディレクトリへアクセスさせる事も可能です。
DocumentRoot "/home/sakura/public_html" |
<Directory /> では、サーバルートディレクトリに対する設定を行っています。これは、これより下の行で出てくる<Directory>(ドキュメントルートディレクトリ)とは別のものなので区別するようにしてください。デフォルトでは、シンボリックリンクのみ許可するようになっています。特に設定を変更する必要はないでしょう。
<Directory /> Options FollowSymLinks AllowOverride None </Directory> |
2度目に出てくる<Directory>では、ドキュメントルートを指定します。これは、上の行で出てきたDocumentRoot
と同じディレクトリを指定しておきます。なお、この<Directory>内で指定する設定に関しては非常に重要なので
<Directory "/home/sakura/public_html"> Options FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> |
Multiviews を有効にしておくことで、曖昧なURLを指定した場合でも、クライアントに対して最適な値を検索して返す事ができるようになります。具体的に説明すると、仮にホームディレクトリ内にtest.php
がある場合に、http://linux.click-rescue.com/test とブラウザに入力すると、そのようなファイルがないため通常は「ページが表示されません」というエラーが返されますが、Multiviewsが有効になっていると、自動的にtest.*
で始まる全てのファイルを検索し、結果としてtest.php をクライアントに返します。ひとつ注意点としては、Options
All を指定したとしても、Multiviews は有効にはなりません。必ず、明示的に記述しておく必要があります。
Options Multiviews |
ユーザーにホームページスペースを提供する場合などに指定するのが、UserDir ディレクティブです。デフォルトでは、public_html
になっています。この指定により、ユーザーのWebサイトのURL は、http://linux.click-rescue.com/~sakuraという形式になり、実際にコンテンツを置く場所は、/home/sakura/public_html
になります。
UserDir public_html |
ユーザーディレクトリの詳細な設定は、すぐ下に記述されている、
<Directory /home/*/public_html> 中略 </Directory> |
の間で指定します。サンプルで用意されているものは、読み取り専用サイトの例を表しています。必要に応じてコメントを削除し、サイトを提供するルールに従って変更してください。
ユーザー用のディレクトリを提供するには、ユーザーのディレクトリである /home/sakura と初期ディレクトリの
piblic_html のパーミッションを変更する必要があります。デフォルトの状態では、ホームディレクトリのパーミッションは、700(rwx------)になっており、他のユーザーには実行権限が付与されていないのでホームページを閲覧することができません。まず、ホームディレクトリのパーミッションを以下のようにして変更します。
$ chmod 711 /home/sakura |
同様にして、public_html にも実行権限、参照権限を与えます。デフォルトでは、public_html
のディレクトリは存在しないので新規に作成します。パーミッションが755 になっていなければ、chmod
コマンドで 755 に変更してください。
$ mkdir /home/sakura/public_html $ chmod 755 /home/sakura/public_html $ ls -l /home/sakura 合計 4 drwxr-xr-x 2 sakura sakura 4096 12月 28 17:00 public_html |
この時、注意しておきたいのは、public_html ディレクトリをroot として作成した場合は、所有者がroot
となっているので、ユーザーsakura はアップロードする事ができません。必ず、以下のようにしてroot
権限でディレクトリの所有者を変更しておきましょう。
# chown sakura.sakura /home/sakura/public_html |
DirectoryIndex は、スラッシュ「/」で終わるURLを指定した際に、デフォルトで表示するファイルを指定するもので、一般的には、index.html
や index.php などを指定しておきます。例えば、http://linux.click-rescue.com/ をブラウザで入力した場合、ドキュメントルート最上層にindex.html
が用意されていればそのファイルが表示されます。もしも、DirectoryIndex で指定したファイルが存在しない場合は、サーバーは、404ステータスコードを返し、ページが見つからない旨をクライアントに伝えます。これは、トップページ限らず、例えば、http://linux.click-rescue.com/photo/
などを指定した場合にも、index.html が用意されていればページが表示されるし、用意されていなければ、404ステータスコード、もしくは403ステータスコード(Forbidden)を返すようになります。
DirectoryIndex index.html index.php |
AccessFileName は、アクセス制御を行うためのファイルを指定します。.htaccess
はディレクトリごとのアクセス制御をかけるためのファイルのことで、通常はドット「. 」で始まるファイル名を指定し、慣例的には.htaccess
がよく使われています。.htaccess の使い方はここでは詳しく説明しませんが、このファイルをアクセス制限をかけたいディレクトリ内に置いておく事でそのディレクトリに対して認証が行われます。そして、認証をパスしたものだけが、そのディレクトリにアクセスできるようになります。なお、デフォルトでは、.htaccess
を使用した認証を行う事はできないようになっており、有効にするには、AllowOverrideの値をAll
もしくは、AuthConfig に設定しておく必要があるので注意してください。
<Files ~ "^\.ht"> 内では、ブラウザからは
.ht で始まるファイル名はアクセスできないように設定しておきます。.htaccess に誰でもブラウザからアクセスできたのでは、その中身を見られてしまうことになるので、このディレクティブは非常に重要な役割を果たしています。
AccessFileName .htaccess <Files ~ "^\.ht"> Order allow,deny Deny from all </Files> |
TypesConfig は、MIME タイプ設定ファイルの位置を設定し、ServerRoot
からの相対パスで記述されています。このファイルはファイルの拡張子からコンテントタイプへの デフォルトのマッピングを設定します。/usr/local/apache2/conf/mime.types
を閲覧すれば、どのようなタイプの拡張子が既に登録済みなのかを確認する事ができます。
TypesConfig conf/mime.types |
上記のMIME タイプファイル に記述されていないマッピングを追加するためには、AddType
ディレクティブを使用して上書きをするという方法をとります。なお、mime.types に直接記述したり、あるいは、.htaccess
を設置し、そこにMIMEタイプの記述をするという方法も考えられます。例えば、着メロの拡張子である.mmf
を追加したい場合、以下のようにする事で実現できます。
|
DefaultType は、MIMEタイプファイルに記述がなかった場合の扱いを指定し、デフォルトでは、text/plain
(テキストファイル)が指定されています。
DefaultType text/plain |
<IfModule mod_mime_magic.c>では、mod_mine_magic.c
モジュールが組み込まれているかどうか確認し、もし組み込まれていれば、ファイル内容から様々な手がかりを探り出しMIMEタイプを決定できるようにしてくれます。mod_mimeは、リクエストされたファイルの拡張子と振る舞い、内容(MIME
タイプ、言語、文字セット、エンコーディング) とを関連付けるモジュールです。例えば、".gif"
が MIME タイプ image/gif にマップされ、".html" が MIME
タイプ text/html にマップされる場合は、ファイル index.gif.html は MIME
タイプ "text/html" に関連付けられます。これは、同じメタ情報にマップされる拡張子が複数あるときには、
右側にあるものが使用されるためです。
<IfModule mod_mime_magic.c> MIMEMagicFile conf/magic </IfModule> |
HostnameLookups は、IPアドレスをホスト名に変換し(逆引き)、ログに記録する機能を提供します。Onにするとパフォーマンスが低下するため、通常はOff
に設定しておき、必要に応じてOn に切り替えるなどしたほうが良いでしょう。また、使う機会はあまりないと思いますが、逆引きを行うのであれば、Apache
に付属のlogresolve を使用する事もできます。
HostnameLookups Off |
ServerTokens は、HTTPレスポンスヘッダーの値を返し、その中に含まれるサーバーOS
に関する情報、コンパイルされたモジュールなどの情報などを返します。これらの情報を相手に提供するのは決して好ましいとはいえないので、コメントアウトして無効にするか、最低限の情報しか表示させないようにします。ServerTokens
には、いくつかのレベルを設定する事ができ、デフォルトではFull に設定されています。最も少ない情報を提供するためには、Prod
を指定します。以下は、筆者の環境下で試した結果です。
ServerTokens Full
Apache/2.0.48 (Unix) mod_ssl/2.0.48 OpenSSL/0.9.7c DAV/2
PHP/4.3.4 Server at ns Port 80
ServerTokens OS
Apache/2.0.48 (Unix) Server at ns Port 80
ServerTokens Min[imal]
Apache/2.0.48 Server at ns Port 80
ServerTokens Minor
Apache/2.0 Server at ns Port 80
ServerTokens Major
Apache/2 Server at ns Port 80
ServerTokens Prod[uctOnly]
Apache Server at ns Port 80
ServerTokens Prod |
ServerSignature は、エラーメッセージなどをクライアントに返す際のフッターラインを表示させるかどうかを指定するディレクティブです。これらの情報を隠蔽するには、値をOff
にしておきます。なお、On と Off の他にも、EMail という値も指定する事ができ、上記のServerTokensの例で言うと、ns
と表示されているところにリンクが貼られるようになります(mailto:)。
ServerSignature Off |
Alias /icons/ は、アイコンが格納されているディレクトリです。FancyIndexing
を使わないのなら不要なので全てコメントアウトしておきます。Alias とは、ドキュメントルート以外の場所にファイルを保管することを可能にします。この時、注意したいのは、Alias
/icons/ とAlias /icon では、異なる意味を示しています。/icons/ のようにスラッシュが入った場合は、/icons
というURL自体はエイリアスされません。詳しくは、Apacheのマニュアルを参照してください。
#Alias /icons/ "/usr/local/apache2/icons/" # #<Directory "/usr/local/apache2/icons"> # Options Indexes MultiViews # AllowOverride None # Order allow,deny # Allow from all #</Directory> |
AliasMatch は、上記で説明したAlias ディレクティブと同様の役割をしますが、簡単な先頭からのマッチを行なうのではなく、
標準正規表現を利用します。ここでは、マニュアルが格納されているディレクトリへのエイリアスをしており、マニュアルは必要ないため、マニュアルに関するディレクティブを全行コメントアウトしておきます。
# AliasMatch ^/manual(?:/(?:de|en|fr|ja|ko|ru))?(/.*)?$
"/usr/local/apache2/manual$1"
#<Directory "/usr/local/apache2/manual"> # Options Indexes # AllowOverride None # Order allow,deny # Allow from all # # <Files *.html> # SetHandler type-map # </Files> # # SetEnvIf Request_URI ^/manual/de/ prefer-language=de # SetEnvIf Request_URI ^/manual/en/ prefer-language=en # SetEnvIf Request_URI ^/manual/fr/ prefer-language=fr # SetEnvIf Request_URI ^/manual/ja/ prefer-language=ja # SetEnvIf Request_URI ^/manual/ko/ prefer-language=ko # SetEnvIf Request_URI ^/manual/ru/ prefer-language=ru # RedirectMatch 301 ^/manual(?:/(de|en|fr|ja|ko|ru)){2,}(/.*)?$ /manual/$1$2 #</Directory> |
ScriptAlias /cgi-bin/ は、CGIスクリプトへのエイリアスを行っており、2番目の引数にCGIスクリプトが格納されているローカルファイルパスを指定しておきます。バーチャルホストを構築している場合、<VirtualHost>ディレクティブ内にScriptAlias
ディレクティブがない場合、デフォルトでここで指定したパスを見に行きます。逆に言えば、バーチャルホストごとにcgi-bin
ディレクトリの位置を変更したい場合は、各VirtualHostディレクティブ内でScriptAlias
ディレクティブを記述しておく必要があります。
ScriptAlias /cgi-bin/
"/home/sakura/public_html/cgi-bin" <Directory "/home/sakura/public_html/cgi-bin"> AllowOverride None Options None Order allow,deny Allow from all </Directory> |
なお、上記で指定したScriptAlias はあくまでCGIスクリプトの場所をApache に教えているだけなので、実際にCGIスクリプトを使えるようにするには、AddHandlerディレクティブが有効になっている必要があります。AddHandler
は、ファイル名の拡張子を指定されたハンドラにマップする役割を持っており、以下のように記述しておく事で、拡張子
".cgi" で終わるファイルをCGI スクリプトとして処理するこができるようになります。
AddHandler cgi-script .cgi |
cgi-bin ディレクトリ内にgif やjpg などが格納されたディレクトリがあり、そこから画像などを読み込む場合、Apacheはそれらの画像ファイルをスクリプトとしてみなしてしまうため、サーバーエラーが発生します。これを回避するためには、<Direcotry>コンテナ内に、以下のようにAddHandler指示子を追加してあげる必要があります。
ScriptAlias /cgi-bin/
"/home/sakura/public_html/cgi-bin" <Directory "/home/sakura/public_html/cgi-bin"> AllowOverride None Options None Order allow,deny Allow from all AddHandler text/html .html AddHandler text/css .css AddHandler image/gif .gif AddHandler image/jpg .jpg </Directory> |
Redirect は、URLの転送(リダイレクション)を行うディレクティブです。サーバーを移転する際や、URLを変更したい場合などに、簡単に古いURLから新しいURLへと転送させることができるようになります。この処理は一瞬で行われるため、クライアントにリダイレクトの処理が行われた事を意識させることなく、新URLへ転送させることが可能になります。記述例は以下のようになります。この時注意したいのは、新しいURLとして指定する2番目の引数は必ず、絶対パスで記述しなくてはならないということです。以下の例で説明すると、http://linux.click-rescue.com/
は、http://new.click-rescue.com へリダイレクトされます。
Redirect / http://new.click-rescue.com/ |
Redirect には、以下の4つのオプションを付け加える事ができます。
Redirect permanent
永久にリダイレクトをするステータス (301) を返します。リソースが永久に移動した場合に使用します。
Redirect temp
一時的なリダイレクトステータス (302) を返します。
Redirect seeother
"See Other" ステータス (303) を返します。リソースが他のもので置き換えられた場合に使用します。
Redirect gone
"Gone" ステータス (410) を返します。リソースが永久に 削除された場合に使用します。引数は省略しなければなりません。
IndexOptions は、ディレクトリインデックスの様々な挙動を指定するディレクティブです。デフォルトで記述されているFancyIndexing
は、飾り付きインデックスをオンにします。VersionSort は、バージョン番号を含んだファイルが
自然な方法でソートされるようにします。仮にfoo-1.7とfoo-1.7.2 とfoo-1.8というファイルがあった場合に、バージョン番号の低いものから順に上からソートされます。IndexOptions
には、様々なオプションがあり、ここでは敢えて説明を割愛させていただきます。詳しく知りたい方は、Apache
のドキュメントを参照してください。
IndexOptions FancyIndexing VersionSort |
AddIconByTypeは、FancyIndexing において、ファイルの左側に表示するアイコンを設定します。パスは相対パスを指定しておきます。ディレクトリインデックスを行わない場合は不要となりますので必要に応じてコメントアウトしても構わないでしょう。以下に記述されているAddIconディレクティブも同様です。
AddIconByType (TXT,/icons/text.gif)
text/* AddIconByType (IMG,/icons/image2.gif) image/* AddIconByType (SND,/icons/sound2.gif) audio/* AddIconByType (VID,/icons/movie.gif) video/* |
DefaultIcon は、FancyIndexing において、特定のアイコンがない場合にファイルに表示するアイコンを設定します。これも、ディレクトリインデックスを使わないのなら不要です。
DefaultIcon /icons/unknown.gif |
ReadmeName と HeaderName は、ディレクトリインデックスを使用している場合に表示されるフッターとヘッダーファイルを指定します。ディレクトリインデックスを使用しない場合は、不要なのでコメントアウトしておきます。
# ReadmeName README.html # HeaderName HEADER.html |
IndexIgnore は、ディレクトリインデックスを行う場合に、無視するファイルを指定します(インデックス一覧に表示されないファイル名を指定する)。引数には、無視したい拡張子やファイル名の一部、ワイルドカード表現か完全なファイル名を指定しておきます。ディレクトリインデックスを行わない場合は不要です。
IndexIgnore .??* *~ * |
LanguagePriority は、使用する言語の優先順位を指定します。ここでは、日本を表す
ja を先頭に持ってきています。
LanguagePriority ja en ca cs da de el eo es et fr he hr it ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW |
ForceLanguagePriority は、 要求に合うドキュメントを一つだけ返すことができないときに、
LanguagePriority ディレクティブを使ってネゴシエーションの結果を返します。デフォルトでは、Prefer
と Fallback が指定されていますが、特に変更する必要はありません。Prefer は、クライアントの
Accept-Language ヘッダをみて、それが同等の優先順位であった場合などには、LanguagePriority
で指定された順に送られます。Fallback は、クライアントのAccept-LanguageからLanguagePriority
で指定された許容言語が見つからなかった場合に、LanguagePriorityで指定された最初のものから順番に送られるという指定になります。
ForceLanguagePriority Prefer Fallback |
AddDefaultCharset は、明示的に指定のないCharset が見つからない場合に、デフォルトで返すCharset
を指定します。デフォルトでは、ISO-8859-1(Latin-1)になっているため、日本語環境では文字化けが発生します。このディレクティブは必ず、無効にしておくか、あるいは明示的にデフォルトのCharset
を指定しておく必要があります。明示的に指定する場合、サイトのコンテンツに合わせて、none、shift_jis、EUC-JPのどれかをしておけばいいでしょう。
# AddDefaultCharset ISO-8859-1 |
SSI を使用する場合には、以下2行のディレクティブを有効にしておきます。Apache1.3x とはディレクティブの指定が異なり、1.3xの場合は、AddHandler server-parsed .shtml と指定します。
AddType text/html
.shtml AddOutputFilter INCLUDES .shtml |
なお、SSI を利用するもうひとつの方法として、XBitHack というディレクティブを使用する事もできます。これがOn
になっている場合、HTMLファイルに実行権を与えるだけで(chmod +x index.html )、ファイル名を
.shtml に変更しなくてもいいという利点があります。詳しく知りたい方は、Apache のドキュメントを参照してください。
XBitHack on |
ErrorDocument は、エラーが発生した場合にクライアントに表示するメッセージをカスタマイズすることができます。通常は、Apache
に標準で用意されているエラーメッセージが表示されるか、もしくは、IEやNescape などのブラウザにデフォルトのエラーメッセージが返されます。404ステータスコードの「ページが表示されません」などが代表的な例で、この無味乾燥なエラーメッセージが気にくわない方は自分でカスタマイズしてみてください。指定できるのは、ダブルクォーテーション「"」で囲んだテキストメッセージのパターンと、URLを指定して、そこにエラーメッセージの用のHTMLなどを用意しておくパターンがあります。また、Perl
を用いたCGI を指定する事なども可能です。URLを指定する場合は、相対パス、絶対パスどちらでも構いません。因みに当サイトのエラーメッセージはこちらをクリックしてください。
ErrorDocument 404
/missing.html ErrorDocument 403 /forbidden.html |
なお、バーチャルホストを構築している場合は、全てのサイトが同じエラーメッセージを返すというのではあまり面白いとはいえないので、以下のようにして<VirtualHost>
ディレクティブ内にもErrorDocument ディレクティブを指定しておいた方がいいでしょう。
|
また、デフォルトで用意されているエラーメッセージにエイリアスさせたい場合は、以下の30行のラインのコメントを削除し、ディレクティブを有効にします。ただし、通常は、403、404、500、401ぐらいしか使わないと思うので全てアンコメントする意味はあまり感じませんが…。
# Alias /error/
"/usr/local/apache2/error/" # # <Directory "/usr/local/apache2/error"> 中略 # ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var # ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var |
<VirtualHost *> は、複数Webサイトを構築する際に必要となるディレクティブです。おそらく自宅サーバーを構築する方なら誰もが複数のWebサイトを構築したいと思うでしょうが、その際に、マシンをわざわざ2台用意する必要はありません。一台のサーバーで、仮想的に複数のWebサイトを運営する事ができるのです。まず、NameVirtualHost
ディレクティブをアンコメントし、有効にします。
*:80 には、「IPアドレス:ポート番号(Listen)」を指定しますが、アスタリスクの場合は、全てのIPアドレスにマッチします。
NameVirtualHost
*:80 <VirtualHost *> ServerAdmin root@click-rescue.com ServerName linux.click-rescue.com DocumentRoot /home/sakura/public_html/linux ScriptAlias /cgi-bin/ "/var/data/cgi-bin/" ErrorLog logs/linux-error_log TransferLog logs/linux-access_log ErrorDocument 403 /error/403.php ErrorDocument 404 /error/404.php </VirtualHost> |
まず、Apache のログ指定では、以下のように4つのログフォーマットが用意されており、デフォルトでは、2行目のcommon
が指定されています。
LogFormat "%h %l
%u %t \"%r\" %>s %b \"%{Referer}i\"
\"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent |
上記の4つのLogFormat のうち、どのログ形式を使用するかを指定するディレクティブが以下のCustomLog
フォーマットです。もう予測はついたと思いますが、要するに自分の環境に合ったLogFormat を作成し、それをCustomLogで指定すればいいわけです。
CustomLog logs/access_log common |
そこでまず覚えておきたいのが、Apache のログフォーマットの変数です。%h だの%l だの書かれていても何のことだかさっぱりわからないと思うので、以下表を参考にしログのフォーマットをカスタマイズしていきます(他にももっとたくさんあります)。詳細について詳しく知りたい方は以下URLを参照してください。
⇒http://httpd.apache.org/docs-2.0/ja/mod/mod_log_config.html
%a | リモートIPアドレス |
%A | ローカルIPアドレス |
%B | HTTPヘッダを除いた転送バイト数 |
%b | HTTPヘッダを除いた転送バイト数。転送バイト数が0の場合は - が記述されます。 |
%h | リクエストしたリモートホスト名 |
%H | リクエストされたプロトコル |
%l | identによるリモート・ユーザ名 |
%t | リクエストを受けた時刻 |
%r | HTTPリクエストヘッダー |
%s | サーバーがリクエストに対して返したステータスコード。%>s と記述することで最後のリクエストを記します。 |
%U | リクエストされたURL |
%u | 認証に使用されたリモートユーザー名 |
%v | リクエストを処理するサーバー名 |
%V | UseCanonicalNameディレクティブの設定に応じたサーバー名 |
その他にも、どのURLから来たかを取得するリファラーを指定する場合には、%{Referer}i
をつけます。%{User-Agent}i はクライアントのブラウザやOS の情報を取得することができます。なお、デフォルトで用意されているcombined
を使用すればユーザーエージェントとリファラーがログに記録されます。
CustomLog logs/access_log combined |
Apache のログはデフォルトでは、リクエストされた画像情報までログに残します。しかし、これらの情報はあまり必要ないし、仮に1ページに10個の画像が配置されていたら、10行の画像情報のログを吐くことになるため、ログが無駄に肥大化します。また、ログを閲覧する際にも非常に見にくくなりますので画像に関してはログには出力しないように設定しておきます。ここでは、Apache
のモジュールのひとつである、SetEnvIf を使用します。SetEnvIf はApache のインストール時にデフォルトで組み込まれていますが、念のため以下コマンドで確認しておいてください。
# apachectl -l mod_setenvif.c |
192.38.233.56
- - [19/Jan/2004:00:48:40 +0900] "GET
/img/a.jpg HTTP/1.1" 404 294 192.38.233.56 - - [19/Jan/2004:00:48:54 +0900] "GET /img/b.jpg HTTP/1.1" 404 294 192.38.233.56 - - [19/Jan/2004:00:49:02 +0900] "GET /img/c.jpg HTTP/1.1" 404 294 |
次に、httpd.conf を編集していきます。以下のようにSetEnvIf
ディレクティブを追記し、CustomLog にenv=!nolog を追加しておきます。ドット「.
」の前にはエスケーブ文字「\」をつけるのも忘れないようにしましょう。筆者の場合は、.css と .js
の情報もいらないのでついでに追加しておきます。
CustomLog logs/access_log
combined env=!nolog # SetEnvIf SetEnvIf Request_URI "\.(gif)|(jpg)|(png)|(css)|(js)$" nolog |
最後にApache を再起動します。再起動したら、画像がたくさん置いてあるページにアクセスしてログを確認してみてください。かなりすっきりした表示になっていると思います。
# apachectl restart |
Apache には、Nimda やCodeRed などのワークのログも記録されます。access.log
を開いてみると以下のようなログが出力されているのが見つかると思います。以下はCodeRed のログで、Apache
を使っている方にとっては無視してもいいので(CodeRed やNimda はIISを対象としたワーム)、ログを記録しないか、あるいは別出力するように設定しておきます。
219.154.22.X - - [19/Jan/2004:10:50:21 +0900] "GET /default.ida?XXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX %u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.0" 404 209 |
まず、以下のようなワームが残すログをaccess_log には記録しないように設定し、また、ワームのログだけを
worm_log に別出力とすることにします。
SetEnvIf Request_URI "^/_mem_bin/"
worm nolog SetEnvIf Request_URI "^/_vti_bin/" worm nolog SetEnvIf Request_URI "^/c/" worm nolog SetEnvIf Request_URI "^/d/" worm nolog SetEnvIf Request_URI "^/msadc/" worm nolog SetEnvIf Request_URI "^/MSADC/" worm nolog SetEnvIf Request_URI "^/scripts/" worm nolog SetEnvIf Request_URI "^/default.ida" worm nolog CustomLog logs/access_log combined env=!nolog # ワームログを切り落とす CustomLog logs/worm_log combined env=worm # ワームログを別出力 |
最後に、worm_log をローテーションできるようにしておきます。/etc/logrotate.d/httpd
に以下のようにワームのログローテート設定を追加しておきます。ログのローテーションに関しては、「logrotate
によるログのローテーション」を参照してください。
# vi /etc/logrotate.d/httpd |
/usr/local/apache2/logs/access_log /usr/local/apache2/logs/error_log
/usr/local/apache2/logs/worm_log { weekly rotate 4 missingok sharedscripts postrotate /bin/killall -HUP `cat /usr/local/apache/logs/httpd.pid 2>/dev/null` 2> /dev/null endscript } |
Remote_Host | リモートホスト名 |
Remote_Addr | リモートアドレス |
Remote_User | 認証されたユーザ名 |
Request_Method | 使用されているメソッド名 |
Request_Protocol | リクエストが行なわれたプロトコルの名前とバージョン(HTTP1.1など) |
Request_URI | URL のスキームとホストの後の部分 |
ここまできたら、もう要領は同じですね。自分のネットワークからのアクセスを外部からのアクセスログとは別に出力します。また、上記で設定した画像情報も出力しないようにしておきます。ログのローテーションも上記の要領で行っておいてください。
SetEnvIf Remote_Addr
^172\.16\. localnet nolog CustomLog logs/localnet_log common env=!nolog CustomLog logs/localnet_log common env=localnet |
httpd.conf を眺めていると以下のような行が見つかると思います。このディレクティブを有効にすると、エージェントログとリファラーログが別出力されるようになるので、アクセス層を調べたり、参照元を調べたりするにはちょうどいいかもしれません。興味のある方は、ディレクティブを有効にして、試してみてください。
CustomLog logs/referer_log
referer CustomLog logs/agent_log agent |
Mozilla/4.0 (compatible;
MSIE 6.0; Windows 98; Win 9x 4.90) Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322) Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/106.2 (KHTML, like Gecko) Safari/100.1 |
Apache のエラーログを記録するerror.log のデフォルトのログレベルはwarn に設定されています。運用状態にあるサーバでは、warn
もしくは、noticeでも構いませんが、テスト段階であれば、info や debug を使ったりもします。以下に、設定できるログレベルについて解説しておきます。でも、実際に試してみないとイメージが沸かないと思うので、自分で試してみることをお勧めします。
ErrorLog logs/error.log LogLevel warn |
emerg | 緊急に対処する必要があるメッセージを記録する |
alert | 警告メッセージを記録する |
crit | 致命的なメッセージを記録する |
error | 存在しないファイルへのアクセスなどのエラーが記録される |
warn | 警告メッセージ。設定ミスがある場合に、警告を発する。 |
notice | 通知メッセージを記録する |
info | プロセスの起動や停止などの情報が記録される |
debug | デバッグに必要となる情報を記録する |
www.it-shikaku.jp
[Top] | |
[講義目次] | |
[2.08:ドメインネームサーバ] | |
[2.09:HTTPサーバーとプロキシサーバー] | |
[2.09.1 Apache HTTPサーバーの設定と管理] | |
[2.09.2 OpenSSLとHTTPSの設定] | |
[2.09.3 nginxの設定と管理] | |
[2.09.4 Squidの設定と管理] | |
[2.10:電子メールサービス] | |
[講義検索] | |
[リンク集] |